// Magic Software, Inc.
// http://www.magic-software.com
// Copyright (c) 2000, All Rights Reserved
//
// Source code from Magic Software is supplied under the terms of a license
// agreement and may not be copied or disclosed except in accordance with the
// terms of that agreement.  The various license agreements may be found at
// the Magic Software web site.  This file is subject to the license
//
// RESTRICTED USE SOURCE CODE
// http://www.magic-software.com/License/restricted.pdf

#ifndef MGCALPHASTATE_H
#define MGCALPHASTATE_H

#include "MgcRenderState.h"
MgcSmartPointer(MgcAlphaState);


class MgcAlphaState : public MgcRenderState
{
    MgcDeclareDefaultState(MgcAlphaState);
    MgcDeclareRTTI;
    MgcDeclareStream;

public:
    MgcAlphaState ();
    virtual Type GetType () const;


    // blending
    enum SrcBlendFunction
    {
        SBF_ZERO,
        SBF_ONE,
        SBF_DST_COLOR,
        SBF_ONE_MINUS_DST_COLOR,
        SBF_SRC_ALPHA,
        SBF_ONE_MINUS_SRC_ALPHA,
        SBF_DST_ALPHA,
        SBF_ONE_MINUS_DST_ALPHA,
        SBF_SRC_ALPHA_SATURATE,
        SBF_QUANTITY
    };

    enum DstBlendFunction
    {
        DBF_ZERO,
        DBF_ONE,
        DBF_SRC_COLOR,
        DBF_ONE_MINUS_SRC_COLOR,
        DBF_SRC_ALPHA,
        DBF_ONE_MINUS_SRC_ALPHA,
        DBF_DST_ALPHA,
        DBF_ONE_MINUS_DST_ALPHA,
        DBF_QUANTITY
    };

    bool& BlendEnabled ();
    SrcBlendFunction& SrcBlend ();
    DstBlendFunction& DstBlend ();

    // testing
    enum TestFunction
    {
        TF_NEVER,
        TF_LESS,
        TF_EQUAL,
        TF_LEQUAL,
        TF_GREATER,
        TF_NOTEQUAL,
        TF_GEQUAL,
        TF_ALWAYS,
        TF_QUANTITY
    };

    bool& TestEnabled ();
    TestFunction& Test ();
    MgcReal& Reference ();

protected:
    bool m_bBlendEnabled;
    SrcBlendFunction m_eSrcBlend;
    DstBlendFunction m_eDstBlend;

    bool m_bTestEnabled;
    TestFunction m_eTest;
    MgcReal m_fReference;  // in [0,1]
};

MgcRegisterStream(MgcAlphaState);
#include "MgcAlphaState.inl"

#endif
